#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <string.h>
#include <pthread.h>

// 先引入LVGL核心头文件，确保lv_obj_t类型被定义
#include "../lvgl/lvgl.h"
// 再引入UI头文件
#include "../UI/screens/ui_desktop.h"
// 引入LVGL开关控件头文件
#include "lvgl/src/widgets/lv_switch.h"

// 移除重复的外部声明，使用头文件中定义的变量

// 全局变量保存LED值文件描述符
static int led_fd = -1;
static int is_initialized = 0;
static pthread_t monitor_thread;
static int thread_running = 0;

// 控制LED状态
void set_led_state(int state) {
    if (!is_initialized || led_fd == -1) {
        return;
    }

    if (state) {
        write(led_fd, "1", 1); // 点亮LED
    } else {
        write(led_fd, "0", 1); // 关闭LED
    }
    fsync(led_fd);
}

// 监控线程：轮询检测开关状态
static void *switch_monitor_thread(void *arg) {
    while (thread_running) {
        // 确保UI对象已初始化
        if (ui_ledSwitch == NULL) {
            usleep(100000);
            continue;
        }
        
        // 获取开关当前状态（1为打开，0为关闭）
        int state = lv_obj_has_state(ui_ledSwitch, LV_STATE_CHECKED) ? 1 : 0;  // 使用通用函数

        // 控制LED
        set_led_state(state);

        // 短暂休眠，降低CPU占用
        usleep(100000); // 100ms检测一次
    }
    return NULL;
}

// 初始化LED控制和监控线程
int led_control_init(void) {
    int fd;

    if (is_initialized) {
        return 0;
    }

    // 导出GPIO 120
    fd = open("/sys/class/gpio/export", O_WRONLY);
    if (fd == -1) {
        perror("open export");
        return -1;
    }
    write(fd, "120", 3);
    fsync(fd);
    close(fd);

    // 等待系统创建文件
    usleep(100000);

    // 设置为输出
    fd = open("/sys/class/gpio/gpio120/direction", O_WRONLY);
    if (fd == -1) {
        perror("open direction");
        return -1;
    }
    write(fd, "out", 3);
    fsync(fd);
    close(fd);

    // 打开value文件
    led_fd = open("/sys/class/gpio/gpio120/value", O_WRONLY);
    if (led_fd == -1) {
        perror("open value");
        return -1;
    }

    // 初始状态：关闭LED
    set_led_state(0);

    // 启动监控线程
    thread_running = 1;
    if (pthread_create(&monitor_thread, NULL, switch_monitor_thread, NULL) != 0) {
        perror("pthread_create");
        close(led_fd);
        led_fd = -1;
        return -1;
    }

    is_initialized = 1;
    return 0;
}

// 清理资源
void led_control_cleanup(void) {
    int fd;

    if (!is_initialized) {
        return;
    }

    // 停止线程
    thread_running = 0;
    pthread_join(monitor_thread, NULL);

    // 关闭LED
    set_led_state(0);
    close(led_fd);
    led_fd = -1;

    // 取消导出GPIO
    fd = open("/sys/class/gpio/unexport", O_WRONLY);
    if (fd != -1) {
        write(fd, "120", 3);
        fsync(fd);
        close(fd);
    }

    is_initialized = 0;
}